import numpy as np    # Python中进行数值计算的库
import pandas as pd    # Python中进行数据处理的库
import warnings
warnings.filterwarnings('ignore') #  忽略弹出的warnings

data = pd.read_csv('Lending_Club.csv',encoding="ISO-8859-1")
data.shape #查看数据量大小
data.head(6)#查看部分数据

### 查看数据集缺失情况
missingDf = data.isnull().sum().sort_values(ascending=False).reset_index()#常用的数据缺失值查看方法，ascending=False是降序排列
missingDf.columns = ['feature', 'miss_num']
missingDf['miss_percentage'] = missingDf['miss_num'] / data.shape[0]    # 缺失值比例
print(missingDf.head(10))   # 缺失值最多的前十列特征

print("原始数据集144列特征中:\n" )
print("有%d列特征含有缺失值" % missingDf[missingDf['miss_num'] > 0].shape[0])
print("有%d列的特征缺失值比例在30%%以上" % missingDf[missingDf['miss_percentage'] > 0.3].shape[0])

thr = (1 - 0.3) * data.shape[0]  
data = data.dropna(thresh=thr, axis=1)     #若某一列数据缺失的数量超过阀值就会被删除
print("去除掉缺失值占比大于0.3的特征之后,当前还剩%d列特征" %(data.shape[1]))

### 缺失特征过多的样本可以考虑直接整行删除
data['row_missing'] = data.apply(lambda x: x.isnull().sum(), axis=1).to_frame()     # 计算每条样本的缺失值列数
print(data['row_missing'].value_counts())    # 观察所有样本行的缺失值情况

data = data[data['row_missing'] < 8]       # 删掉缺失值大于等于8列的样本
data.drop(['row_missing'], axis=1, inplace=True)    # 删掉刚刚加入原始数据集的统计列
print("去除掉缺失特征大于8列的样本之后，当前还剩%d行数据" % data.shape[0])
print()

### dti属性是数值特征，可以使用均值或中位数进行填充
print("dti特征列有%d个缺失值\n" % data['dti'].isnull().sum())
print("dti特征列的统计信息:\n", data['dti'].describe())
data['dti'].fillna(data['dti'].median(), inplace=True)
print("\n填充中位数后dti特征列的统计信息:\n", data['dti'].describe())
print("\n此时dti特征列有%d个缺失值\n" % data['dti'].isnull().sum())

### 以revol_util(信用账户的使用率)特征为例，导入sklearn的随机森林算法预测缺失值
from sklearn.ensemble import RandomForestRegressor
rfDf = data.copy()
# 用revol_util特征值非空的样本构建训练集，revol_util特征值缺失的样本构建测试集
rfDf_train = rfDf.loc[rfDf['revol_util'].notnull()]
rfDf_test = rfDf.loc[rfDf['revol_util'].isnull()]
col = ['loan_amnt', 'int_rate', 'installment', 'revol_bal', 'collection_recovery_fee']    # 原始数据集中的无缺失数值特征
# 划分训练数据和标签（label）
X = rfDf_train[col]
y = rfDf_train['revol_util']
# 训练过程
rf = RandomForestRegressor(n_estimators=100,n_jobs=-1)    
rf.fit(X, y)
# 预测过程
pred = rf.predict(rfDf_test[col])
rfDf.loc[(rfDf['revol_util'].isnull()), 'revol_util'] = pred    # 填补缺失值
print("此时的revol_util特征统计指标:\n")
print(rfDf['revol_util'].describe())
